'use strict';

const Controller = require('egg').Controller;

class UserController extends Controller {
  // 注册
  async register() {
    const {
      ctx
    } = this;
    const {
      username,
      password
    } = ctx.request.body
    console.log('查看注册时前端传入中间件的用户名和密码', username, password);

    if (!username || !password) {
      ctx.body = {
        code: 500,
        msg: '账号或密码不能为空111注册111',
        data: null
      }
      return
    }

    // 判断username在数据库中是否存在
    const resultInfo = await ctx.service.user.getUserByName(username)
    // 这个 resultInfo 是否有值，取决于账号在数据库中是否存在



    // 这个账号已经被注册过了
    if (resultInfo && resultInfo.id) {
      ctx.body = {
        code: 500,
        msg: '账号已被注册，请重新输入',
        data: null
      }
      return
    }




    // 往数据库植入数据
    const result = await ctx.service.user.register({
      username,
      password,
      // 头像
      avatar: 'https://img2.baidu.com/it/u=1915681330,636879278&fm=26&fmt=auto',
      // 注册时间戳
      ctime: Date.now()
    })

    // 注册成功
    if (result) {
      ctx.body = {
        code: 200,
        msg: '注册成功',
        data: null
      }
    } else {
      ctx.body = {
        code: 500,
        msg: '注册失败',
        data: null
      }
    }
  }


  // 修改签名
  async alterUserInfo() {
    const {
      ctx
    } = this
    const {
      username,
      avatar,
      sign
    } = ctx.request.body
    console.log('查看修改头像及签名时后端打印:', sign);

    // 传入头像和签名，进行数据库的修改
    const result = await ctx.service.user.alterUserInfo({
      username,
      avatar,
      sign
    })

    // 修改成功
    if (result) {
      ctx.body = {
        code: 200,
        msg: '修改成功',
        data: null
      }
    } else {
      ctx.body = {
        code: 500,
        msg: '修改失败',
        data: null
      }
    }
  }

  // 修改密码
  async alterPassword() {
    const { app, ctx } = this
    const {
      old_pass,
      new_pass
    } = ctx.request.body
    console.log('修改密码的后端处，获取的原密码和新密码：', old_pass, new_pass);

    // 获取到用户的密码，进行核查
    // 拿到请求头
    const token = ctx.request.header.authorization
    // 通过 token 反解析出用户信息
    const decode = await app.jwt.verify(token, app.config.security)
    console.log('我在修改密码处，想看token解析出来的用户信息。', decode);
    if (!decode) {
      console.log('token检验失败，id获取失败');
      return
    }
    const user_name = decode.username
    // 这里拿着个人id去获取个人所有信息
    const userInfoMsg = await ctx.service.user.getUserByName(user_name)
    console.log('通过token获取用户名，再查询具体用户信息', userInfoMsg);

    if (old_pass != userInfoMsg.password) {
      // 原密码出错
      ctx.body = {
        code: 500,
        msg: '原密码输入错误',
        data: null
      }
    } else {
      // 原密码正确，进行密码的修改
      const result = await ctx.service.user.alterPassword({
        user_name,
        new_pass
      })

      if (result) {
        ctx.body = {
          code: 200,
          msg: '密码修改成功',
          data: null
        }
      } else {
        ctx.body = {
          code: 500,
          msg: '密码修改失败',
          data: null
        }
      }
    }
  }


  // 登入
  async login() {
    // this指代调用login的函数，此时表示user，但传参是登入的传参
    const {
      ctx,
      app
    } = this
    const {
      username,
      password
    } = ctx.request.body


    // 账号或密码为空
    if (!username || !password) {
      ctx.body = {
        code: 500,
        msg: '账号或密码不能为空111登入111',
        data: null
      }
      return
    }

    // 检测当前登入用户在数据库中是否存在
    const userInfo = await ctx.service.user.getUserByName(username)

    console.log('中间件拿到的用户信息', userInfo);
    // 密码错误
    if (userInfo && userInfo.password != password) {
      ctx.body = {
        code: 500,
        msg: '密码错误',
        data: null
      }
      return
    }



    // 说明没啥错误，账号密码都对，给前端生成 token 标记
    // 这个轮子接收两个参数：加密内容、加密添加的字符串
    // exp 有效时间 毫秒为单位
    const token = app.jwt.sign({ //轮子上的sign方法
      id: userInfo.id,
      username: userInfo.username,
      exp: Math.floor((Date.now() / 1000) + (24 * 60 * 60))
    }, app.config.jwt.secret)

    console.log(token);


    // 既然生成了token，那就给到前端，储存起来
    ctx.body = {
      code: 200,
      msg: '登入成功',
      data: {
        token
      }
    }



  }

  // 获取用户信息以用于展示
  async showUserMsg() {
    const {
      ctx,
      app
    } = this
    try {
      // 从请求头获取到token
      const token = ctx.request.header.authorization
      // 通过token反解析出用户信息
      const decode = await app.jwt.verify(token, app.config.security)
      // console.log('在用户页面获取信息时token检验后的一些信息', decode);    //{ id: 4, username: 'aaa', exp: 1636265781, iat: 1636179381 }
      // console.log('我想看看这个是什么app.config.secret', app.config.secret);     //undefined
      if (!decode) {
        console.log('token检验失败,id获取失败');
        return
      }
      const user_name = decode.username
      // 这里拿着个人id去获取个人所有信息
      const userInfoMsg = await ctx.service.user.getUserByName(user_name)
      // console.log('通过token获取用户名，再查询具体用户信息',userInfoMsg);
      ctx.body = {
        code: 200,
        msg: '请求成功',
        data: {
          userInfoMsg
        }
      }
    } catch (error) {
      ctx.body = {
        code: 500,
        msg: '系统错误',
        data: null
      }
      console.log(error);
    }
  }
}

module.exports = UserController;